<?php

declare(strict_types=1);

namespace app\api\service;

use app\admin\model\ForbiddenWord;
use think\facade\Cache;

class ForbiddenWordService
{
    // 缓存键名
    const FORBIDDEN_WORDS_CACHE_KEY = 'forbidden_words_list';
    // 缓存时间 (秒)，可以根据实际情况调整，例如每天更新一次
    const CACHE_EXPIRE = 3600 * 24;

    /**
     * 获取所有违禁词
     * @return array
     */
    public static function getForbiddenWords(): array
    {
        // 尝试从缓存中获取
        $words = Cache::get(self::FORBIDDEN_WORDS_CACHE_KEY);

        if (empty($words)) {
            $list = config('forbiddenWord.words');
            $list = explode(',', $list);
            $words = array_map('trim', $list);
            $words = array_filter($words);

            // 存入缓存
            Cache::set(self::FORBIDDEN_WORDS_CACHE_KEY, $words, self::CACHE_EXPIRE);
        }

        return (array)$words;
    }

    /**
     * 检查文本中是否包含违禁词
     * @param string $text 要检查的文本
     * @return array 如果包含违禁词，返回匹配到的违禁词数组，否则返回空数组
     */
    public static function checkText(string $text)
    {
        $forbiddenWords = self::getForbiddenWords();

        if (empty($forbiddenWords)) {
            return [];
        }
        foreach ($forbiddenWords as $word) {
            if (mb_stripos($text, $word) !== false) {
                $text = str_replace($word, "***", $text);
            }
        }
        return $text;
    }
}
